<?php
/****************************************************************
* MAGPHP Micro Framework										*
* Author by mag796fd											*
* MAIL: mag@magphp.com											*
* Website: http://www.magphp.com								*
****************************************************************/


//===============================================================
//设置编码
//===============================================================
header('Content-Type:text/html; charset=utf-8');


//===============================================================
//框架系统sys目录路径
//===============================================================
if(file_exists('./sys/magphp.php'))
{
	define( 'SYSDIR' , '.' );
}
else
{
	define( 'SYSDIR' , '..' );
}


//===============================================================
//框架系统【配置】数据
//===============================================================
$configdata = array(
	'URLREWRITE'	=>	true, //U方法返回URL模式，是否为伪静态模式
);


//===============================================================
//PHP.ini 初始化设置
//===============================================================
//开启短标签 On 1 / Off 0
//ini_set('short_open_tag', 1);
if(ini_get('short_open_tag') == '')
{
	echo '您的php.ini中没有开启“短标签”设置，请将short_open_tag=Off 设置为 short_open_tag=On 之后重启WEB服务器使其生效。<hr/>';
}
//显示错误提示On 1 / Off 0
ini_set('display_errors', 1); 

//提示级错误。避免【echo $val;】这样不赋值就会报错的情况。
//-----------------
// Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
// Development Value: E_ALL
// Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
//-----------------
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
//error_reporting(E_ALL^E_NOTICE);
//error_reporting(E_ALL & ~E_NOTICE);

//避免忘记，自动开启session_start()
//ini_set('session.auto_start', 1); //强制开启 自动session_id，开启后不必再执行session_start()命令。
if(ini_get('session.auto_start') == 0)
{
	session_start();
}

//sessionid在客户端采用的存储方式搜索，置1代表使用cookie记录客户端的sessionid，同时，$_COOKIE变量里才会有$_COOKIE[‘PHPSESSIONID’]这个元素存在
if(ini_get('session.use_cookies') == 0)
{
	ini_set('session.use_cookies', 1);
}


//===============================================================
//引入框架系统函数集
//===============================================================
include(SYSDIR.'/sys/sysfunction.php');


//===============================================================
//URL路由
//===============================================================
// dump($_SERVER['PHP_SELF']);
// dump($_SERVER['QUERY_STRING']);
$appfile = 'index';
$c = 'Index';
$a = 'index';
$appdir = '';
$routeARR = preg_split("[/]", $_SERVER['PHP_SELF']);

if(!GETROUTE('c')) //如果使用伪静态路由
{
	//dump($routeARR);
	//xx.php之前的部分
	foreach ($routeARR as $key => $val) 
	{
		if(preg_match("[\.php]", $val)) //如果当前是xx.php
		{
			$appfile = $val;
			break;
		}
		elseif($val)
		{
			$appdir .= '/'.$val;
		}
	}

	//控制器和方法
	$isExtNum = 0; //URL拆分后，xx.php的$key值
	foreach ($routeARR as $key => $val) 
	{
		$isExtNum = $key;

		if(preg_match("[\.php]", $val)) //如果当前是xx.php
		{
			if($routeARR[$key-1] != '')
			{
				
			}
			if($routeARR[$key+1] != '')
			{
				$c = $routeARR[$key+1];
				$_GET['c'] = $c;
			}
			
			if($routeARR[$key+2] != '')
			{
				$a = $routeARR[$key+2];
				$_GET['a'] = $a;
			}
			break;
		}
	}
	// dump($_GET);
	// dump($routeARR);
	//dump($isExtNum);

	//累加附加参数
	$isExtForNum = 0;
	foreach ($routeARR as $key => $val) 
	{
		if($key>($isExtNum+2) && $val!='')
		{
			if( ($isExtForNum%2)==0 ) //偶数
			{
				$_GET[$routeARR[$key]] = $routeARR[$key+1];
			}
			$isExtForNum += 1;
		}
	}
	//dump($_GET);
	//dump($routeARR);
}
else
{
	//GET或POST获得控制器名称、方法名称（默认都是index控制器和index方法）
	$c = GETROUTE('c') ? GETROUTE('c') : 'Index';
	$a = GETROUTE('a') ? GETROUTE('a') : 'index';
	foreach ($routeARR as $key => $val) 
	{
		if(preg_match("[\.php]", $val)) //如果当前是xx.php
		{
			$appfile = $val;
			break;
		}
		elseif($val)
		{
			$appdir .= '/'.$val;
		}
	}
}
//设置全局控制器和方法变量
define( 'C' , $c );
define( 'A' , $a );
define( 'APPDIR' , $appdir );

// echo APPDIR.'<br/>';
// echo 'c='.C.' a='.A.'<br/>';
// dump($routeARR);
// die(); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

define( 'APPFILE' , $appfile );
define( 'AFILE' , $a.'.php' );

//获取入口文件名
$appindexSTR = APPDIR.'/'.APPFILE; //组合 /aa/bb/xx.php
define( 'APPINDEX' , $appindexSTR );

//销毁临时 控制器 和 方法 名称的变量等
unset($c);
unset($a);
unset($appdir);
unset($appfile);


//===============================================================
//自动创建应用目录与文件
//===============================================================

if(!is_dir(APPNAME)) @mkdir(APPNAME,0777,true); //创建应用目录
if(!is_dir('Lib')) @mkdir('Lib',0755,true); //创建公共 Lib 目录
if(!is_dir('cache')) @mkdir('cache',0777,true); //创建文件缓存目录

// 应用目录是否存在
if(is_writable(APPNAME))
{
	//如果应用目录不存在则开始一系列创建
	//if(!is_dir(APPNAME.'/Controller'))
	//{
		//-------------------目录们-------------------
		if(!is_dir(APPNAME.'/Controller')) @mkdir(APPNAME.'/Controller',0755,true); //创建应用 Controller 目录
		if(!is_dir(APPNAME.'/Lib')) @mkdir(APPNAME.'/Lib',0755,true); //创建应用 Lib 目录
		if(!is_dir(APPNAME.'/Model')) @mkdir(APPNAME.'/Model',0755,true); //创建应用 Model 目录
		if(!is_dir(APPNAME.'/Views/Index')) @mkdir(APPNAME.'/Views/Index',0755,true); //创建应用 Views/Index 目录

		//-------------------文件们-------------------
		// Lib/config.php
		$fileCode = '<?php'."\r\n";
		$fileCode .= '//公共【配置】文件数据'."\r\n";
		$fileCode .= '$configdata = array('."\r\n";
		$fileCode .= chr(9)."'testConfig1' => '这是第一条测试配置数据', //测试配置数据1"."\r\n";
		$fileCode .= ""."\r\n";
		$fileCode .= "	//数据库相关配置，调用DB()函数必须进行一下配置"."\r\n";
		$fileCode .= "	//============================="."\r\n";
		$fileCode .= "	//SQLITE"."\r\n";
		$fileCode .= "	//'DB' => array("."\r\n";
		$fileCode .= "	//	'database_type' => 'SQLite', //数据库类型"."\r\n";
		$fileCode .= "	//	'database_file' => 'magphp_sqlite3.db', //SQLITE数据库文件路径"."\r\n";
		$fileCode .= "	//),"."\r\n";
		$fileCode .= ""."\r\n";
		$fileCode .= "	//MYSQL"."\r\n";
		$fileCode .= "	//'DB' => array("."\r\n";
		$fileCode .= "	//	'database_type' => 'mysql',"."\r\n";
		$fileCode .= "	//	'database_name' => 'name',"."\r\n";
		$fileCode .= "	//	'server' => 'localhost',"."\r\n";
		$fileCode .= "	//	'username' => 'your_username',"."\r\n";
		$fileCode .= "	//	'password' => 'your_password',"."\r\n";
		$fileCode .= "	//),"."\r\n";
		$fileCode .= ""."\r\n";
		$fileCode .= "	'LANG_DEF' => 'CN', //全局默认语言"."\r\n";
		$fileCode .= ');'."\r\n";
		if(!is_file('Lib/config.php')) @file_put_contents('Lib/config.php',$fileCode);

		// Lib/function.php
		$fileCode = '<?php'."\r\n";
		$fileCode .= '//【公共】自定义函数'."\r\n";
		$fileCode .= 'class PF{'."\r\n";
		$fileCode .= chr(9).'public static function testPublicfun(){'."\r\n";
		$fileCode .= '		echo "这是一个公共函数调用输出测试结果";'."\r\n";
		$fileCode .= '	}'."\r\n";
		$fileCode .= ''."\r\n";
		$fileCode .= '	public static function getname(){'."\r\n";
		$fileCode .= '		echo "这是PF类的getanem()方法值";'."\r\n";
		$fileCode .= '	}'."\r\n";
		$fileCode .= '}'."\r\n";
		if(!is_file('Lib/function.php')) @file_put_contents('Lib/function.php',$fileCode);

		// Lib/lang.php
		$fileCode = '<?php'."\r\n";
		$fileCode .= '//【语言】数据文件'."\r\n";
		$fileCode .= '$langdata = array('."\r\n";
		$fileCode .= '	//CN 中文'."\r\n";
		$fileCode .= '	//EN 英文'."\r\n";
		$fileCode .= '	"CAMP_立即登录"			=>array('."\r\n";
		$fileCode .= '								"CN"=>"立即登录",'."\r\n";
		$fileCode .= '								"EN"=>"Login Now"'."\r\n";
		$fileCode .= '								),'."\r\n";
		$fileCode .= ''."\r\n";
		$fileCode .= '	"CAMP_申请成为机构"		=>array('."\r\n";
		$fileCode .= '								"CN"=>"申请成为机构",'."\r\n";
		$fileCode .= '								"EN"=>"Reg Camp"'."\r\n";
		$fileCode .= '								),'."\r\n";
		$fileCode .= ');'."\r\n";
		if(!is_file('Lib/lang.php')) @file_put_contents('Lib/lang.php',$fileCode);

		// APP/Controller/IndexController.php
		$fileCode = '<?php'."\r\n";
		$fileCode .= 'class IndexController extends Controller{'."\r\n";
		$fileCode .= chr(9).'public function __construct(){ }'."\r\n";
		$fileCode .= ''."\r\n";
		$fileCode .= '	public function index(){'."\r\n";
		$fileCode .= '		$data["hello"] = "<h1 style=\"text-align:center;\">欢迎使用MAGPHP微框架！</h1><br/>";'."\r\n";
		$fileCode .= '		$this->display($data);'."\r\n";
		$fileCode .= '	}'."\r\n";
		$fileCode .= '}'."\r\n";
		if(!is_file(APPNAME.'/Controller/IndexController.php')) @file_put_contents(APPNAME.'/Controller/IndexController.php',$fileCode);

		// APP/Model/MytableModel.php
		$fileCode = '<?php'."\r\n";
		$fileCode .= 'class MytableModel extends Model{'."\r\n";
		$fileCode .= chr(9).'public function __construct(){ }'."\r\n";
		$fileCode .= '}'."\r\n";
		if(!is_file(APPNAME.'/Model/MytableModel.php')) @file_put_contents(APPNAME.'/Model/MytableModel.php',$fileCode);

		// APP/Views/Index/index.php
		$fileCode = '<!doctype html>'."\r\n";
		$fileCode .= '<html>'."\r\n";
		$fileCode .= '<head>'."\r\n";
		$fileCode .= '<meta charset="utf-8">'."\r\n";
		$fileCode .= '<title>MAGPHP框架</title>'."\r\n";
		$fileCode .= '</head>'."\r\n";
		$fileCode .= '<body>'."\r\n";
		$fileCode .= '	<?=$hello?>'."\r\n";
		$fileCode .= '<div style="text-align:center;"><a href="http://www.magphp.com" target="_blank" style="font-size:18px; color:#000; text-decoration:none;">访问[MAGPHP官网]获得更多帮助信息！</a></div>'."\r\n";
		$fileCode .= '</body>'."\r\n";
		$fileCode .= '</html>'."\r\n";
		if(!is_file(APPNAME.'/Views/Index/index.php')) @file_put_contents(APPNAME.'/Views/Index/index.php',$fileCode);

		// APP/Lib/config.php
		$fileCode = '<?php'."\r\n";
		$fileCode .= '//【应用配置】文件，同名配置会覆盖掉【公共配置】中的数据'."\r\n";
		$fileCode .= '$configdata = array('."\r\n";
		$fileCode .= '		"appconf"	=>	"这是应用配置appconf测试内容",'."\r\n";
		$fileCode .= ');'."\r\n";
		if(!is_file(APPNAME.'/Lib/config.php')) @file_put_contents(APPNAME.'/Lib/config.php',$fileCode);

		// APP/Lib/function.php
		$fileCode = '<?php'."\r\n";
		$fileCode .= '//【应用】自定义函数'."\r\n";
		$fileCode .= 'class AF{'."\r\n";
		$fileCode .= '	public static function testfun(){'."\r\n";
		$fileCode .= '		echo "这是应用的testfun()调用输出测试结果";'."\r\n";
		$fileCode .= '	}'."\r\n";
		$fileCode .= '}'."\r\n";
		if(!is_file(APPNAME.'/Lib/function.php')) @file_put_contents(APPNAME.'/Lib/function.php',$fileCode);
	//}
}
else
{
	die("应用目录 ".APPNAME." 不可写，请手动生成应用目录！");
}



//===============================================================
//配置文件、公共函数文件引入
//===============================================================
//【APP】默认配置
$configBaseData = $configdata;

//【公共】配置文件
$configPublicFile = SYSDIR.'/Lib/config.php';
if(file_exists($configPublicFile))
{
	include($configPublicFile); //公共配置文件
}
$configPublicData = array();
if(isset($configdata))
{
	$configPublicData = $configdata;
}

//【本应用】配置文件
$configAppFile = './'.APPNAME.'/Lib/config.php';
if(file_exists($configAppFile))
{
	include($configAppFile); //本应用配置文件（用户可自行修改）
}
$configAppData = array();
if(isset($configdata))
{
	$configAppData = $configdata;
}

$configdata = array();
$configdata = array_merge($configBaseData,$configPublicData,$configAppData); //组合配置数据
//建立配置类
class Config{
	public static $configdata;
}
Config::$configdata = $configdata;


//多语言
//【公共】语言文件
$langFile = SYSDIR.'/Lib/lang.php'; //框架跟路径下，语言文件
if(file_exists($langFile)) //如果语言文件存在
{
	include($langFile); //载入【公共】语言文件
}
$rootLangdata = $langdata; //跟语言数据
//【本应用】语言文件
$appLengFile = './'.APPNAME.'/Lib/lang.php'; //应用下，语言文件
if(file_exists($appLengFile)) //如果语言文件存在
{
	include($appLengFile); //载入【本应用】语言文件
}
$appLangdata = $langdata; //应用语言数据
if(count($appLangdata)>0)
{
	//组合配置数据，因为是二维数组所以需要遍历
	foreach ($rootLangdata as $key => $val) {
		if(count($appLangdata[$key])>0)
		{
			$alllangdata[$key] = array_merge($rootLangdata[$key],$appLangdata[$key]);
		}
		else
		{
			$alllangdata = $rootLangdata; //如果应用中数组为空
		}
	}
}
else
{
	$alllangdata = $rootLangdata; //如果应用中数组为空
}
//建立配置类，为了其他类内外、方法内外都能方便调用到所以使用类形式保存
class Lang{
	public static $langdata;
}
Lang::$langdata = $alllangdata;


//（所有函数名都不能重复，否则报错）
//【公共】函数文件
$functionPublicFile = SYSDIR.'/Lib/function.php';
if(file_exists($functionPublicFile))
{
	include($functionPublicFile); //公共函数文件
}
//【本应用】函数文件
$functionFile = './'.APPNAME.'/Lib/function.php';
if(file_exists($functionFile))
{
	include($functionFile); //本应用函数文件（用户可自行修改）
}


//系统扩展功能类
$libclassFile = SYSDIR.'/sys/libclass.php';
if(file_exists($libclassFile))
{
	include($libclassFile); //系统扩展功能类
}


//===============================================================
//附加扩展功能类
//===============================================================
//循环载入目录内所有.class.php文件
$extClassDir = SYSDIR.'/sys/Lib/';
$classDirObj = new DirectoryIterator($extClassDir);
foreach ($classDirObj as $classFiles){
	$isFile = $classFiles->getFilename();
	if( is_file( $extClassDir.$isFile ) )
	{
		//只载入.class.php后缀的文件
		if(stripos($isFile,'.class.php') !== false)
		{
			include($extClassDir.$isFile);
		}
	}
}


//===============================================================
//引入数据库类
//===============================================================
include(SYSDIR.'/sys/dbclass.php');


//===============================================================
//引入基础类文件
//===============================================================
//Controller基础类、Model基础类
//===============================================================

//===================================
//Controller基础类
//===================================
class Controller{
	private $tpdata=NULL; //模板中变量
	
	//调用显示模板方法
	public function display( $data=NULL , $templatePath=NULL ){
		//echo "这是Controller类display方法";

		//组合模板本地路径，默认值
		$tempdir = './'.APPNAME.'/Views/'.C.'/'.A.'.php';

		//通过指定模板文件路径载入模板
		if( $templatePath != null )
		{
			if(strpos($templatePath,'.php'))
			{
				$tempdir = $templatePath;
			}
			else
			{
				$pathARR = explode('/',$templatePath);
				$tempdir = './'.APPNAME.'/Views/'.$pathARR[0].'/'.$pathARR[1].'.php';
			}
		}

		//引入模板
		if( !file_exists($tempdir) )
		{
			die('错误：模板文件不存在 - ['.$tempdir.']');
		}
		else
		{
			if(isset($data))
			{
				$this->tpdata = $data; //提供给includeView包含子模板使用
				@extract( $data );
			}
			@include( $tempdir );
		}
	}
	
	//返回AJAX数据ajaxReturn
	public function ajax($data=null)
	{
		// 返回JSON数据格式到客户端 包含状态信息
		// header('Content-Type:application/json; charset=utf-8');
		// exit(json_encode($data));

		AJAX($data);
	}

	//读取被包含的文件
	public function includeView( $filePathName="" )
	{
		/*
		Inc/a.php
		/Public/page/a.php
		*/
		if(substr($filePathName, 0,1) == '/')
		{
			//绝对路径
			$pathStr = '.'.$filePathName;
		}
		else
		{
			//相对路径
			$pathStr = './'.APPDIR.'/'.APPNAME.'/Views/'.$filePathName; //拼接文件路径
		}

		if( !file_exists($pathStr) )
		{
			//die('错误：包含文件不存在 - [<a href="'.$pathStr.'">'.$pathStr.'</a>]');
			die('错误：包含文件不存在 - ['.$pathStr.']');
		}
		else
		{
			//指定了视图文件的情况下，就去尝试读取指定的文件。
			if(isset($this->tpdata))
			{
				@extract( $this->tpdata );
			}
			@include($pathStr);
		}
	}
}

//===================================
//Model基础类
//===================================
class Model{
	public function __construct(){}
}



//===============================================================
//【应用】的控制器
//===============================================================

//引入【应用】的控制器文件
$controllerFile = './'.APPNAME.'/Controller/'.C.'Controller.php';
if( !file_exists($controllerFile) )
{
	die('错误：类文件不存在 - ['.C.'Controller.php](类首字母需大写)');
}
else
{
	include($controllerFile);
}

//实例化【应用】的控制器对象
$className = C.'Controller';
$controller = null;
if( !class_exists( $className ) )
{
	die('错误：类不存在 - ['.C.']');
}
else
{
	$controller = new $className;
};

//调用【应用】的控制器的方法
if( !method_exists( $controller , A ) )
{
	die('错误：不存在方法 - ['.A.']');
}
else
{
	$controllerActionName = A;
	$controller->$controllerActionName();
}

